home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 October: Mac OS SDK / Dev.CD Oct 97 SDK1.toast / Development Kits (Disc 1) / Open Transport / OT1.1 Developer Release / Open Transport SDK / Open Tpt Client Developer / Samples / Internet / OTUdpPitchByNameSample.cp < prev    next >
Encoding:
Text File  |  1996-11-19  |  7.2 KB  |  346 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        OTUdpPitchByNameSample.cp
  3.  
  4.     Contains:    UDP pitch sample code
  5.  
  6.     Copyright:    © 1993-1995 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10.  
  11. // OT UDP Pitch Test Program (as an SIOW app)
  12.  
  13. #include <QuickDraw.h>
  14. #include <stdio.h>
  15. #include <StdLib.h>
  16. #include <TextUtils.h>
  17. #include <strings.h>
  18. #include <String.h>
  19. #include <Events.h>
  20. #include <Desk.h>
  21. #include <OpenTransport.h>
  22. #include <OpenTptInternet.h>
  23.  
  24.  
  25. /*******************************************************************************
  26. ** GLOBAL VARIABLES
  27. ********************************************************************************/
  28.  
  29. #define kMaxDataLen 256
  30.  
  31. const size_t    kMyPoolSize = 60000;
  32.  
  33. InetPort    gPitchPort=0;
  34.  
  35. unsigned long    gNoOfTimes=0;
  36. unsigned short gBindCompleted = 0;
  37.  
  38. OTEventCode    gCode;
  39. TEndpoint*    gCookie;
  40. OSErr        gErr;
  41.  
  42. char theAddr[255];
  43. DNSAddress* hisAddr = (DNSAddress*)theAddr;
  44.  
  45. struct InetAddress reqsin, retsin;
  46. char data[kMaxDataLen];
  47. char defaultData[] = "Go Cal, beat Stanford !!!";
  48.  
  49.  
  50. /*******************************************************************************
  51. ** Function Prototypes
  52. ********************************************************************************/
  53.  
  54. void Inits();
  55. void CleanUp();
  56. void Idle();    
  57. void DoIt();
  58. OSErr DoStaticBind(TEndpoint* ep);
  59. OSErr DoSend(TEndpoint* ep);
  60.  
  61.  
  62. /*******************************************************************************
  63. **  main function
  64. ********************************************************************************/
  65.  
  66. void main(int, char**) 
  67. {
  68.     Inits();
  69.     DoIt();
  70.     CleanUp();
  71. }
  72.  
  73. /*******************************************************************************
  74. ** Initialize Quickdraw and ASLM
  75. ********************************************************************************/
  76.  
  77. void Inits()
  78. {
  79.     InitGraf(&qd.thePort);
  80.     if (InitOpenTransport() != kOTNoError)
  81.     {
  82.         fprintf(stderr, "OTUdpPitch: Could not initialize ASLM, exiting\n");
  83.         exit(1);
  84.     }
  85. }
  86.  
  87. /*******************************************************************************
  88. ** Clean up at the end
  89. ********************************************************************************/
  90.  
  91. void CleanUp()
  92. {
  93.     CloseOpenTransport();
  94. }
  95.  
  96. /*******************************************************************************
  97. ** Idle
  98. ********************************************************************************/
  99.  
  100. void Idle()
  101. {
  102.     SystemTask();
  103. }
  104.  
  105. /*******************************************************************************
  106. ** EventHandler
  107. ********************************************************************************/
  108.  
  109. pascal void EventHandler(void*, OTEventCode event, OTResult result,
  110.                                void* cookie)
  111. {
  112.     if (event == T_BINDCOMPLETE)
  113.     {
  114.         gBindCompleted = 1;
  115.     }
  116.     else if (event == T_OPENCOMPLETE)
  117.     {
  118.         gErr = (OSErr) result;
  119.         gCookie = (TEndpoint*) cookie;
  120.         gCode = event;
  121.     }
  122.     return;
  123. }
  124.  
  125. /*******************************************************************************
  126. ** DoIt
  127. ********************************************************************************/
  128.  
  129. void DoIt()
  130. {
  131.     TEndpoint* ep = NULL;
  132.     TEndpointInfo info;
  133.     OSErr err=0;
  134.     long myport=0;
  135.     InetHost    myaddr=0;
  136.     char mystr[255];
  137.  
  138.     myport = 0;
  139.     fprintf(stderr, "What UDP port should I use to send data ? (enter UDP port number)\n");
  140.     if (gets(mystr) != 0) 
  141.     {
  142.         stringtonum(mystr, &myport);
  143.         gPitchPort =(InetPort)  myport;
  144.     }
  145.     else
  146.     {
  147.         fprintf(stderr, "Couldn't get source port from window!\n");
  148.         return;
  149.     }
  150.     
  151.     OTInitInetAddress(&reqsin, gPitchPort, (InetHost) 0);
  152.     
  153.     fprintf(stderr, "Enter the target as name:port\n");
  154.     if (gets(hisAddr->fName) != 0) 
  155.     {
  156.         hisAddr->fAddressType = AF_DNS;
  157.     }
  158.     else
  159.     {
  160.         fprintf(stderr, "Couldn't get target address and port from window!\n");
  161.         return;
  162.     }
  163.     
  164.     fprintf(stderr, "What should I send ? (enter data string)\n");
  165.     if (gets(data) == 0) {
  166.         strcpy(data, defaultData);
  167.         fprintf(stderr, "sending default data: <%s>\n", data);
  168.     }
  169.     data[strlen(data)] = '\n';
  170.  
  171.     fprintf(stderr, "How many times should I send this data ?\n");
  172.     if (gets(mystr) != 0) {
  173.         stringtonum(mystr, &myport);
  174.         gNoOfTimes = (unsigned short) myport;
  175.     }
  176.     else
  177.     {
  178.         fprintf(stderr, "Couldn't get number to send from window!\n");
  179.         return;
  180.     }    
  181.     
  182.     fprintf(stderr, "The program will send <%d> packets to <%s>\n", gNoOfTimes, hisAddr->fName);
  183.  
  184.     do
  185.     {
  186.         //
  187.         // Now create a UDP
  188.         //
  189.         gCode = 0;
  190.         gCookie = NULL;
  191.         gErr = 0;
  192.         err = OTAsyncOpenEndpoint(OTCreateConfiguration(kUDPName), 0, &info, EventHandler, 0);
  193.         if ( err == kOTNoError )
  194.         {
  195.             while ( gCode == 0 )
  196.                 OTIdle();
  197.             err = gErr;
  198.         }
  199.         if ( err != kOTNoError )
  200.         {
  201.             ep = NULL;
  202.             fprintf(stderr,"ERROR: OpenEndpoint(\"UDP\") failed with %d\n", err);
  203.             break;
  204.         }
  205.         else
  206.         {
  207.             ep = gCookie;
  208.         }
  209. #ifdef O        
  210.         //
  211.         // Install notifier we're going to use for testing
  212.         //
  213.         err = ep->InstallNotifier(&EventHandler, 0);
  214.         if ( err != kOTNoError )
  215.         {
  216.             fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
  217.             break;
  218.         }
  219. #endif
  220.         //
  221.         // Try to bind
  222.         // 
  223.         ep->SetAsynchronous();
  224.         err = DoStaticBind(ep);
  225.         if ( err != kOTNoError )
  226.             break;        
  227.  
  228.         ep->SetSynchronous();
  229.  
  230.         while (gNoOfTimes--)
  231.         {
  232.             err = DoSend(ep);
  233.             if ( err != kOTNoError )
  234.                 break;
  235.             Idle();
  236.         }
  237.         //
  238.         // Try to Unbind
  239.         // 
  240.         err = ep->Unbind();
  241.         if ( err != kOTNoError )
  242.         {
  243.             fprintf(stderr, "ERROR: Unbind() returned %d\n", err);
  244.             break;
  245.         }
  246.     } while (false);
  247.  
  248.     if (ep)
  249.     {
  250.         //
  251.         // Remove notifier
  252.         //
  253.         ep->RemoveNotifier();
  254.         //
  255.         // Get rid of endpoint.
  256.         //
  257.         err = ep->Close();
  258.         if ( err != kOTNoError )
  259.         {
  260.             fprintf(stderr, "ERROR: CloseEndpoint() failed with %d\n", err);
  261.         }
  262.     }
  263.     fprintf(stderr, "Bye\n");
  264. }
  265.  
  266. /*******************************************************************************
  267. ** DoStaticBind
  268. ********************************************************************************/
  269.  
  270. OSErr DoStaticBind(TEndpoint* ep)
  271. {
  272.     TBind req, ret;
  273.     OSErr err=0;
  274.  
  275.     // bind udp to current address and port
  276.     req.addr.len = sizeof(struct InetAddress);
  277.     req.addr.buf = (unsigned char *) &reqsin;
  278.     req.qlen = 1;                                        // don't care for udp
  279.     ret.addr.maxlen = sizeof(struct InetAddress);
  280.     ret.addr.buf = (unsigned char *) &retsin;
  281.  
  282.     err = ep->Bind(&req, &ret);
  283.     if ( err != kOTNoError )
  284.     {
  285.         fprintf(stderr, "Static Bind returns %d\n", err);
  286.         return err;
  287.     }
  288.     while (gBindCompleted == 0)
  289.     {
  290.     }
  291.     gBindCompleted = 0;
  292.     return ( err != kOTNoError );
  293. }
  294.  
  295. /*******************************************************************************
  296. ** DoSend
  297. ********************************************************************************/
  298.  
  299. OSErr DoSend(TEndpoint* ep)
  300. {
  301.     OSErr        err;
  302.     OTResult     res;
  303.     TUnitData    unitdata;
  304.  
  305.     // Send a UDP datagram
  306.  
  307.     unitdata.addr.len = sizeof(OTAddressType) + strlen(hisAddr->fName);
  308.     unitdata.addr.buf = (UInt8*)hisAddr;
  309.     unitdata.opt.len = 0;
  310.     unitdata.opt.buf = 0;
  311.     unitdata.udata.len = strlen(data);
  312.     unitdata.udata.buf = (unsigned char *) data;
  313.     
  314.     err = ep->SndUData( &unitdata);
  315.  
  316.     if ( err != kOTNoError )
  317.     {
  318.         if (err == kOTLookErr)
  319.         {
  320.             res = ep->Look();
  321.             switch (res)
  322.             {
  323.                 case T_LISTEN:
  324.                 case T_CONNECT:
  325.                 case T_DATA:
  326.                 case T_EXDATA:
  327.                 case T_DISCONNECT:
  328.                 case T_UDERR:
  329.                 case T_ORDREL:
  330.                 case T_GODATA:
  331.                 case T_GOEXDATA:
  332.                 default:
  333.                     fprintf(stderr, "t_look returns %d\n", res);
  334.                     break;
  335.             }
  336.         }
  337.         else
  338.             fprintf(stderr, "SndUData() returns %d\n", err);
  339.     }
  340.     else 
  341.     {
  342.         fprintf(stderr, "Sent <%s> to <%s>\n", data, hisAddr->fName);
  343.     }
  344.     return err;
  345. }
  346.